package smlab.view.ui
{
	import flash.display.DisplayObject;
	import flash.display.Loader;
	import flash.display.Sprite;
	import flash.system.ApplicationDomain;
	
	import smlab.utils.Trace_SM;
	
	/**
	 * 加载后的资源管理/获取类
	 * @author weiwei_zhang
	 * 
	 */
	public class ResourceManager_SM extends Sprite
	{
		private static var _appDomain:ApplicationDomain;//要获取资源定义的域
		private static var _getClassFromHaspAswingFun:Function;//Aswing 资源获取的方法
		
		public function ResourceManager_SM()
		{
		}
		
		public static function init(appDomain:ApplicationDomain):void
		{
			_appDomain =appDomain;
		}
		
		/**
		 * 设置 Aswing 资源获取的方法，为了兼容保留下来
		 * @param fun
		 * 
		 */
		public static function setGetClassFromHaspAswingFun(fun:Function):void
		{
			_getClassFromHaspAswingFun=fun;
		}
		
		/**
		 * 以前旧的 Aswing 资源获取，为了兼容保留下来
		 * @param n
		 * @return 
		 * 
		 */
		public static function getClassFromHaspAswing(n:String):*
		{
			return _getClassFromHaspAswingFun(n);
		}
		
		/**
		 * 从当前域获取所有类型资源定义
		 * @param n
		 * @return 
		 * 
		 */
		public static function getClassByName(n:String):Class
		{
			var c:Class;
			
			try{
				c=_appDomain.getDefinition(n) as Class;
			}catch(e:*){
				Trace_SM.trace("获取类定义【"+n+"】的时候出错，找不到该定义。");
			}
			
			return c;
		}
		
		/**
		 * 从当前域获取显示对象的资源定义的实例
		 * @param n
		 * @return 
		 * 
		 */
		public static function getDisplayObjectByName(n:String):DisplayObject
		{
			if(!_appDomain){
				throw new Error("ResourceManager_SM not init yet.! _appDomain is null.");
			}
			
			var c:Class;
			
			try{
				c=_appDomain.getDefinition(n) as Class;
			}catch(e:*){
				Trace_SM.trace("获取类定义【"+n+"】的时候出错，找不到该定义。");
			}
			
			if(c){
				var dc:DisplayObject=new c() as DisplayObject;
				return dc;
			}
			return null;
		}
		
		/**
		 * 从 loader 中获取资源定义
		 * @param n
		 * @param loader
		 * @return 
		 * 
		 */
		public static function getDefintionByNameFromLoader(n:String,loader:Loader):*
		{
			var d:*=loader.contentLoaderInfo.applicationDomain.getDefinition(n);
			return d;
		}
	}
}